#include <TCHAR.H>
#include <windows.h>
#include "win.h"

// const TCHAR szHint[]    = _T("Press ESC to quit.");
class KHelloWindow : public KWindow
{
    virtual void OnKeyDown(WPARAM wParam, LPARAM lParam)
    {
        if (wParam==VK_ESCAPE )
        {
            PostMessage(m_hWnd, WM_CLOSE, 0, 0);
        }
    }
    virtual void OnDraw(HDC hDC)
    {
        RECT rect;
        GetClientRect (m_hWnd, &rect) ;
        DrawText (hDC, TEXT ("Hello, Windows 98!"), -1, &rect,
                    DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
        //TextOut(hDC, 0, 0, szHint, lstrlen(szHint));
    }
    // 修改默认窗口属性
   virtual void GetWndClassEx(WNDCLASSEX & wc)
    {
        KWindow::GetWndClassEx(wc);

        wc.style         = CS_HREDRAW | CS_VREDRAW;
        wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
    }
public:
};
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
    SetProcessDpiAwarenessContext (DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2); // hiDPI after win10 1703
    KHelloWindow win;
    win.CreateEx(0, 
        _T("Hello"),// 类名 
        _T("The Hello Program"),// 窗口标题 
        WS_OVERLAPPEDWINDOW,
        GetSystemMetrics(SM_CXSCREEN)/4, 
        GetSystemMetrics(SM_CYSCREEN)/4,
        GetSystemMetrics(SM_CXSCREEN)/2,
        GetSystemMetrics(SM_CYSCREEN)/2,
        NULL, NULL, hInstance);
    int iDpi =  GetDpiForWindow(win.m_hWnd); // 96*2.5=240 for 250%

    //没有这一句，窗口永远都无法显示，但程序在内存正常运行！
    //ShowWindow()是绝对不能注释掉的。
    //ShowWindows()立即绘制窗体，但没有客户区的内容。这时Win32根本就不知道客户区的内容
    //然后向消息队列中填充了一个WM_PAINT消息（PostMessage方式）
    //最后SendMessage发送一个WM_SIZE消息
    win.ShowWindow(nCmdShow);

    //UpdateWindow()立即利用SendMessage的方式调用WM_PAINT消息处理函数。
    //ShowWindow()已经Post一个WM_PAINT消息，如果不着急（比如现在），完全可以注释掉下一行
    //win.UpdateWindow();

    return win.MessageLoop();
}